'''
作者: 杨萍
介绍:实验管理-实验室预约审批模块查询接口测试
'''
import json
import unittest
from jsonpath import jsonpath
from parameterized.parameterized import parameterized
from utils.reader import Reader
from utils.session import Session


class QueryTest(unittest.TestCase):
    """
    介绍:查询接口测试
    作者: 杨萍
    """
    session = None
    header = None

    @classmethod
    def setUpClass(cls) -> None:
        """
        测试类级别的脚手架方法，在测试类开始时执行，运行在此类测试方法调用之前
        """
        cls.session = Session.get_session()
        cls.header = Session.get_header()

    @classmethod
    def tearDownClass(cls) -> None:
        """
        测试类级别的脚手架方法，在测试类开始时执行，运行在此类测试方法调用之前
        """
        cls.session.close()

    @parameterized.expand(Reader.read_excel('laboratory.xlsx', min_row=2, max_row=49, min_col=8, max_col=11))
    def test_query(self, url, param, expected_code, expected_msg):
        """
        实验室预约审批模块 查询接口
        """
        data = json.loads(param)

        # 发送请求
        resp = self.session.post(url, json=data, headers=self.header)

        # 断言状态码为200
        self.assertEqual(200, resp.status_code)

        # 提取出请求参数中的applicant,experimentName,experimentName,status对应值
        req_applicant = data["searchDto"]["searchExample"]["applicant"]
        req_experiment_name = data["searchDto"]["searchExample"]["experimentName"]
        req_laboratory = data["searchDto"]["searchExample"]["laboratory"]
        req_status = data["searchDto"]["searchExample"]["status"]



        # 根据响应提取出实际数据
        body = resp.json()

        # 提取出实际响应中的resCode,resMsg,content对应值
        real_res_code = jsonpath(body, "$..resCode")
        real_res_msg = jsonpath(body, "$..resMsg")
        content = jsonpath(body, "$..content")

        # 提取出实际响应content中的applicant,experimentName,experimentName,status对应值
        real_applicant = jsonpath(body, "$..content..applicant")
        real_experiment_name = jsonpath(body, "$..content..experimentName")
        real_laboratory = jsonpath(body, "$..content..laboratory")
        real_status = jsonpath(body, "$..content..status")

        """
        断言实际响应信息中的content值不为空列表时，resCode与预期值一致,resMsg为“OK”;
        如果请求参数中applicant值不为空，断言实际响应content中applicant值包含请求参数中的值;
        如果请求参数中experimentName值不为空，断言实际响应content中experimentName值包含请求参数中的值;
        如果请求参数中laboratory值不为空，断言实际响应content中laboratoryt值包含请求参数中的值;
        如果请求参数中status值不为空，断言实际响应content中status值包含请求参数中的值。
        """
        if content != [[]]:
            self.assertEqual(expected_code, real_res_code[0])
            if real_res_code[0] < 1:
                self.assertEqual(expected_msg, real_res_msg[0])

            if req_applicant != None and real_applicant != False:
                for i in real_applicant:
                    self.assertIn(req_applicant, i)

            if req_experiment_name != None:
                if real_experiment_name != None:
                    for i in real_experiment_name:
                        self.assertIn(req_experiment_name, i)

            if req_laboratory != None:
                if req_laboratory != None:
                    for i in real_laboratory:
                        self.assertIn(req_laboratory, i)

            if isinstance(req_status, int) and req_status < 4:
                self.assertIn(req_status, real_status)

        # 否则实际响应信息中的content值为空列表
        else:
            self.assertEqual([[]], content)







